package Streaming;

import java.util.Random;
import java.util.stream.Stream;

/**
 * @Author: 蔡翔
 * @Date: 2019/10/4 19:51
 * @Version 1.0
 */
public class StreamDemo3 {
    public static void main(String[] args) {
        String str = "my name is oo7";
        // 把每个单词的长度打印出来。
        //这个map就相当于 把对象转成int，经过这个map，那么这个流就不是string流了，而是int流
        // 注意filter里面接收的 是一个断言接口（返回boolen），我们要实现这个断言接口。当这个断言实现 为true 的时候这个对象才不会被过滤出来。
        Stream.of(str.split(" ")).filter(s->s.length() >2).map(s -> s.length())
                .forEach(System.out::println);

        //flatMap A->B属性(是一个集合)，最终得到所有的A元素里面的所有B属性集合。s.chars()返回的是IntStream，实际上需要的是Stream,所以需要boxed() 装箱一下。
        // 注意：intStream/longStream 并不是Stream的子类，所以要进行装箱 boxed
        Stream.of(str.split(" ")).flatMap(s->s.chars().boxed()).forEach(
                i->System.out.println((char)i.intValue())   //直接(char)i 是会报错的，因为i 是Integer对象，要转成int，才能强制类型转换。
        );

        //peek用于debug，是一个中间操作，和forEach一样，但是forEach是终止操作
        System.out.println("-----------peek-----------");
        Stream.of(str.split(" ")).peek(System.out::println).forEach(System.out::println);

        // limit的使用，主要用于无限流。 //产生10个数。也就是限制10个数生成
        System.out.println("-----------limit-----------");
        new Random().ints().filter(i-> i>100&&i<1000).limit(10).forEach(System.out::println);
    }
}
